package controlador;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;

import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JRadioButton;

import modelo.BloqueDeNave;
import modelo.Contacto;
import modelo.Doble;
import modelo.Juego;
import modelo.Mina;
import modelo.Nave;
import modelo.Posicion;
import modelo.Puntual;
import modelo.Triple;
import vista.VentanaPrincipal;
import vista.VistaBloqueDeNave;
import vista.VistaMina;
import vista.VistaRetardo;
import fiuba.algo3.titiritero.modelo.GameLoop;
import fiuba.algo3.titiritero.modelo.ObjetoVivo;

public class Controlador extends MouseAdapter implements ItemListener, ActionListener {

	private VentanaPrincipal ventana;
	private String seleccion;
	private int fila;
	private int columna;
	private Juego juego;
	
	public Controlador(VentanaPrincipal ventana) {
		this.ventana = ventana;
		juego = new Juego();
		juego.ingresarGameLoop(ventana.getGameLoop());
		juego.cargarNavesInicio();
		juego.setVentana(ventana);
		ventana.getPuntaje().setText(Integer.toString(juego.obtenerPuntaje()));
		ventana.getIndicadorPosicion().setText("-");		
	}
	
	@Override
	public void mouseMoved(MouseEvent e) {
		JLabel indicadorPosicion = ventana.getIndicadorPosicion();
		fila = (e.getY() / VentanaPrincipal.LADO + 1);
		columna = (e.getX() / VentanaPrincipal.LADO + 1);
		indicadorPosicion.setText(fila + " - " + columna);
	}
	
	@Override
	public void itemStateChanged(ItemEvent e) {
		JRadioButton fuente = (JRadioButton) e.getSource();
		if (e.getStateChange() == ItemEvent.SELECTED) {
			seleccion = fuente.getName();
		}
	}
	
	@Override
	public void mouseClicked(MouseEvent arg0) {
		
		if (ventana.getGrupoOpciones().getSelection()!=null) {
						
			JLabel puntaje = ventana.getPuntaje();
			Posicion posicion = new Posicion(fila,columna);
			GameLoop gameLoop = ventana.getGameLoop();
		
			switch (seleccion) {

			case ("Disparo"):
				juego.disparar(posicion);
				break;
			case ("Contacto"):{				
				Mina unaMina= new Contacto(posicion);
				VistaMina vstMina = new VistaMina(unaMina);
				juego.colocarMina(unaMina);
				gameLoop.agregar(vstMina);				
				break;
				}
			case ("Puntual"):{
				Mina unaMina= new Puntual(posicion);
				VistaMina vstMina = new VistaRetardo(unaMina);				
				gameLoop.agregar(vstMina);				
				juego.colocarMina(unaMina);
				break;
				}
			case ("Doble"):{
				Mina unaMina= new Doble(posicion);
				VistaMina vstMina = new VistaRetardo(unaMina);				
				gameLoop.agregar(vstMina);				
				juego.colocarMina(unaMina);
				break;
				}
			case ("Triple"):{
				Mina unaMina= new Triple(posicion);
				VistaMina vstMina = new VistaRetardo(unaMina);
				gameLoop.agregar(vstMina);				
				juego.colocarMina(unaMina);								
				break;
				}
			}				
			puntaje.setText(Integer.toString(juego.obtenerPuntaje()));			
		}
	}

	@Override
	public void actionPerformed(ActionEvent e) {
		
		ArrayList<Nave> naves = new ArrayList<Nave>();
		ArrayList<BloqueDeNave> partes = new ArrayList<BloqueDeNave>();
		
		GameLoop gameLoop;
		gameLoop = ventana.getGameLoop();
		naves = juego.obtenerTablero().obtenerListaNaves();
		
		for(Nave nave:naves) {
			partes = nave.obtenerPartes();
			for(BloqueDeNave bloque:partes) {
				VistaBloqueDeNave vista = new VistaBloqueDeNave(bloque);
				gameLoop.agregar(vista);
			}
		}
		gameLoop.agregar((ObjetoVivo)juego);
		
		
		try {
			Thread.sleep (2000);
		} catch (Exception exception) {
			
		}
		
		gameLoop.iniciarEjecucion();
		gameLoop.agregarObservador(juego);
		
		((JButton)e.getSource()).setEnabled(false);		
	}
}
